import axios from 'axios';
import store from '@/store';
import router from '@/router';
import { Message } from 'element-ui';
import { getTimeStamp } from './auth';

const timeOut = 3600; // 声明token失效时限的变量

// 创建一个新的axios实例，并设置基地址《《《《———————————————————————————————————
const service = axios.create({
    baseURL: process.env.VUE_APP_BASE_API,
    timeout: 5000
});

// 添加请求拦截器《《《《———————————————————————————————————
service.interceptors.request.use(
    (config) => {
        console.log(config);

        // token是存在vuex中的，引入store（vuex）后，判断是否有token，如果有，则将token注入到请求头中
        if (store.getters.token) {
            console.log(store.getters.token);
            // 如果函数返回的是正值，则超时《《《—————————————————————————————————————
            if (isTimeStampOut()) {
                store.dispatch('user/logOut'); // 1、执行logOut函数，即删除token和用户资料
                router.push('/login'); // 2、退出到登录页面
                return Promise.reject(new Error('登录超时,请重新登录！')); // 3、 new一个错误对象，报出重新登录的警告
            }

            config.headers['Authorization'] = `Bearer ${store.getters.token}`; // 将token注入
        }
        return config;
    },
    (error) => {
        // 对请求错误做些什么
        return Promise.reject(error);
    }
);

// 添加响应拦截器《《《《———————————————————————————————————
service.interceptors.response.use(
    (response) => {
        // 所有返回的数据中，又都一个success， 如果success为true，表示成功
        // response表示服务器返回的数据。 如果返回的数据中，有success为true，则表示成功。正常返回数据
        const { success, message, data } = response.data;
        if (success === true) {
            return data; // 执行成功，直接返回数据data
        } else {
            Message.error(message); // 提示错误信息
            return Promise.reject(new Error(message)); // 返回一个失败的对象 new Error(message)
        }
    },
    (error) => {
        // 如果响应数据失败，则进入此函数。判断error.response.data.code ===10002,则为token失效
        if (error.response && error.response.data && error.response.data.code === 10002) {
            store.dispatch('/user/logOut');
            router.push('/login');
        } else {
            Message.error(error.message); // 提示错误信息
        }
        return Promise.reject(new Error('登录超时，请重新登录！'));
    }
);

// 声明计算token时间戳是否过期的函数《《《《———————————————————————————————————
const isTimeStampOut = () => {
    const currentTime = Date.now(); // 当前的时间戳
    const CookiesTime = getTimeStamp(); // 获取Cookies中保存的时间戳

    // 将两个时间戳的差值，与timeOut进行比较
    return (currentTime - CookiesTime) / 1000 > timeOut; // ? true : false(完整写法，可忽略)
};

export default service;